package com.atguigu.gulimall.order;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 事务的隔离级别
 * 1、读未提交 READ_UNCOMMITTED 可以读到别人未提交的数据，之后如果别人回滚没有提交，就会读到脏数据
 * 2、读已提交 READ_COMMITTED 一个事务可以读到别人提交了的数据，会出现不可重复读的现象
 *    ，事务期间多次读取到的数据可能不一样
 * 3、可重复读 REPEATABLE_READ 一个事务在事务开始的时间点之后，
 *                           读到的数据永远是事务开始的时间点的的数据，事务期间读取到数据永远是不变，是那个时间点的数据
 *                           会出现幻读问题，当数据被插入或者删除，事务完成之后就就会出现新插入的数据没有被修改的情况
 *
 *  4、序列化
 *
 *  本地事务失效问题
 *  同一个事务内方法互调默认失效没，原因，绕过了代理对象，事务是使用代理对象控制的，
 *  方法互调只是将代码copy过来，所有事务的设置都是成了第一个事务的设置
 *  解决：使用代理对象来调用事务方法，不能自己注入自己，这样会导致循环依赖问题
 *  1）、引入spring-boot-starter-aop,引入了aspectj
 *  2）、@EnableAspectJAutoProxy(exposeProxy = true),开启aspectj动态代理功能，以后所有的代理都是aspectj
 *  3）、本类互调用调用对象
 *     OrderServiceImpl orderService = (OrderServiceImpl) AopContext.currentProxy();
 *     orderService.b();
 *     orderService.c();
 *
 *   raft算法的核心：
 *   1）、领导选举 自旋时间+重复选举
 *   2）、日志复制 先该log,再同步其他节点的log，
 *        收到大多数的同步成功消息之后，再提交更改数据
 *        注意，必须收到大多数的同步成功消息之后，才能提交
 *
 *   seata服务器的使用
 *   1）每一个微服务创建 undo_log;
 *   2) 安装seata-server 0.7.1,修改注册中心 registry.conf type = nacos;
 *   3) 解压并启动 seata-server；
 *   4）导入依赖spring-cloud-starter-alibaba-seata
 *   4.5) 使用DataSourceProxy作为数据源的代理
 *   5) 每个微服务 必须导入 register.conf/file.conf
 *
 */

@EnableAspectJAutoProxy(exposeProxy = true)
@EnableFeignClients
@EnableRedisHttpSession
@EnableDiscoveryClient
@EnableRabbit
@SpringBootApplication
public class GulimallOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
